/*
保护性暂停模式（Guarded Suspension Pattern）是一种用于处理多线程间的通信和同步的设计模式。
在多线程环境下，当一个线程需要等待另一个线程的特定条件满足时，可以使用保护性暂停模式。

保护性暂停模式的核心思想是，当一个线程需要等待特定条件满足时，它会进入等待状态，并释放自己持有的锁。
同时，它会通过一个条件变量（或信号量）来通知其他线程，一旦条件满足，它会被唤醒并继续执行。

使用保护性暂停模式的优点包括：

1. 提供了一种有效的线程间通信和同步的机制，避免了线程的忙等待。
2. 可以减少线程间的竞争和冲突，提高系统的效率和性能。
3. 可以使得线程的执行顺序更加有序和可控。

下面是一个使用保护性暂停模式的C语言例程，该例程模拟了一个生产者-消费者的场景：
*/

#include <stdio.h>
#include <pthread.h>

// 共享资源
typedef struct
{
    pthread_mutex_t mutex;
    pthread_cond_t cond;
    int value;
    int isProduced;
} SharedResource;

// 初始化共享资源
void initSharedResource(SharedResource *resource)
{
    pthread_mutex_init(&resource->mutex, NULL);
    pthread_cond_init(&resource->cond, NULL);
    resource->value = 0;
    resource->isProduced = 0;
}

// 生产者线程
void *producer(void *arg)
{
    SharedResource *resource = (SharedResource *)arg;

    // 生产数据
    pthread_mutex_lock(&resource->mutex);
    resource->value = 1;
    resource->isProduced = 1;
    printf("Producer: produced value %d\n", resource->value);

    // 唤醒等待的消费者线程
    pthread_cond_signal(&resource->cond);
    pthread_mutex_unlock(&resource->mutex);

    return NULL;
}

// 消费者线程
void *consumer(void *arg)
{
    SharedResource *resource = (SharedResource *)arg;

    // 等待生产者线程生产数据
    pthread_mutex_lock(&resource->mutex);
    while (!resource->isProduced)
    {
        pthread_cond_wait(&resource->cond, &resource->mutex);
    }

    // 消费数据
    printf("Consumer: consumed value %d\n", resource->value);
    resource->isProduced = 0;

    pthread_mutex_unlock(&resource->mutex);

    return NULL;
}

int main()
{
    SharedResource resource;
    initSharedResource(&resource);

    pthread_t producerThread, consumerThread;

    // 创建生产者线程和消费者线程
    pthread_create(&producerThread, NULL, producer, &resource);
    pthread_create(&consumerThread, NULL, consumer, &resource);

    // 等待线程结束
    pthread_join(producerThread, NULL);
    pthread_join(consumerThread, NULL);

    return 0;
}

/*
在上面的例程中，首先定义了一个共享资源结构体SharedResource，它包含了一个互斥锁mutex和一个条件变量cond，以及一个用于共享的数据value和一个标志位isProduced。
isProduced用于标识生产者是否已经生产了数据。

然后，定义了生产者线程函数producer和消费者线程函数consumer。
在生产者线程函数中，首先生产数据，并设置isProduced为1，然后通过pthread_cond_signal唤醒等待的消费者线程。
在消费者线程函数中，首先使用pthread_cond_wait等待生产者线程生产数据，一旦收到信号，就消费数据，并将isProduced设置为0。

在main函数中，初始化了共享资源对象resource，然后创建了生产者线程和消费者线程。
最后，使用pthread_join等待线程结束。

通过保护性暂停模式，生产者线程和消费者线程可以实现同步和通信。
生产者线程在生产完数据后，通过条件变量唤醒等待的消费者线程，消费者线程在消费完数据后，再次等待生产者线程生产数据。
这样，就可以实现生产者-消费者的场景，并避免了线程的忙等待。
*/